package com.zzxy.spring12.factory;

import com.zzxy.spring12.aspect.MyAspect;
import com.zzxy.spring12.service.IStudentService;
import com.zzxy.spring12.service.impl.StudentServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyBaanFactory {
   public static IStudentService createStudentService(){
       //1.target classes
       StudentServiceImpl studentServiceImpl = new StudentServiceImpl();
       //2.advice
       MyAspect myAspect = new MyAspect();
       //3.weaving
       IStudentService studentServiceProxy = (IStudentService) Proxy.newProxyInstance(MyBaanFactory.class.getClassLoader(), studentServiceImpl.getClass().getInterfaces(), new InvocationHandler() {
           @Override
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               myAspect.before();
               Object obj = method.invoke(studentServiceImpl, args);
               myAspect.after();
               return obj;
           }
       });
        return studentServiceProxy;
    }
}
